package com.example.leo.mycharmingstudent.a0905;

import android.os.AsyncTask;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.leo.mycharmingstudent.R;

public class AsyncTaskActivity extends AppCompatActivity {

    private static final String TAG = "AsyncTaskActivity";

    //开启任务按钮
    private TextView tvExecute;
    //取消任务按钮
    private TextView tvCancel;
    //显示进度
    private TextView tvShowProgress;
    private NetWorkAsyncTask mTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async_task);

        findViews();
        initData();
        initEvent();

    }

    private void findViews() {
        tvExecute = findViewById(R.id.tv_execute_activity_async_task);
        tvCancel = findViewById(R.id.tv_cancel_activity_async_task);
        tvShowProgress = findViewById(R.id.tv_show_progress_activity_async_task);
    }

    private void initData() {

    }

    private void initEvent() {
        tvExecute.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //开启任务
                /*mTask = new NetWorkAsyncTask();
                mTask.execute("执行任务");*/
                DownLoadTask downLoadTask = new DownLoadTask(AsyncTaskActivity.this, new DownLoadTask.IDownLoadListener() {
                    @Override
                    public void preDownLoad() {
                        //使用者做自己要做的事情
                    }

                    @Override
                    public String downLoad(DownLoadTask task) {
                        return "";
                    }

                    @Override
                    public void progress(Integer... values) {

                    }

                    @Override
                    public void complete(String result) {

                    }

                    @Override
                    public void cancel() {

                    }
                });
                downLoadTask.execute();
            }
        });
        tvCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //取消任务
                /*
                调用cancel方法，传值true或false，结果都是一样的，
                doInBackground方法并没有停止运行
                推荐传true

                调用cancel方法以后，会将mCancelled标志位设置为true，
                表示这个任务已经取消了。

                如何让doInBackground方法停止运行？
                通过isCancelled方法，获取mCancelled标志位。
                如果mCancelled为true，手动停止doInBackground方法的执行
                 */
                mTask.cancel(false);
            }
        });
    }

    public class NetWorkAsyncTask extends AsyncTask<String, Integer, String> {

        /**
         * 主线程
         * 在执行具体任务之前，做一些事情
         * 举个栗子：
         * 网络请求之前，toast提示一下，加载一个旋转等待框
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            ToastUtil.showToast(AsyncTaskActivity.this, "准备开始执行任务");
        }

        /**
         * 子线程
         * 执行具体任务
         * 此处报错了：
         * java.lang.RuntimeException: An error occurred while executing doInBackground()
         * Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
         * 子线程中，不得更新UI，或者进行UI操作
         *
         * 如何让doInBackground方法停止运行？
         * 通过isCancelled方法，获取mCancelled标志位。
         * 如果mCancelled为true，手动停止doInBackground方法的执行
         */
        @Override
        protected String doInBackground(String... params) {
            if (params != null && params.length > 0) {
                Log.e(TAG, params[0]);
            }
            //模拟下载
            for (int i = 0; i < 100; i++) {
                if (isCancelled()) {
                    return "cancel了，不执行了！";
                }
                Log.e(TAG, String.format("progress:%d", i));
                publishProgress(i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            /*
            正常情况下，返回的"complete"字符串，会传递给onPostExecute()方法
            如果调用了AsyncTask的cancel方法，返回的"complete"字符串，
            会传递给onCancelled(String s)方法
             */
            return "complete";
        }

        /**
         * 主线程
         * 进度更新
         * java.util.UnknownFormatConversionException: Conversion = 'End of String'
         * 为什么报这个错。
         * String.format()方法：%表示格式化的字符，单用%会报上面的错误
         * 如果想展示一个%，需要用两个%%表示。
         *
         * onProgressUpdate方法，在AsyncTask调用cancel方法以后就不执行了。
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            if (values != null && values.length > 0) {
                String format = String.format("当前已下载 %d %%", values[0]);
                tvShowProgress.setText(format);
            }
        }

        /**
         * 主线程
         * 处理任务的结果
         */
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            tvShowProgress.setText(TextUtils.isEmpty(s) ? "下载完成" : s);
            ToastUtil.showToast(AsyncTaskActivity.this, "下载完成");
        }

        /**
         * 主线程
         * 取消任务
         * 先于onCancelled(String s)调用
         */
        @Override
        protected void onCancelled() {
            super.onCancelled();
            ToastUtil.showToast(AsyncTaskActivity.this, "onCancelled()");
            Log.e(TAG, "onCancelled()");
        }

        @Override
        protected void onCancelled(String s) {
            super.onCancelled(s);
            String format = String.format("onCancelled():s=%s", s);
            ToastUtil.showToast(AsyncTaskActivity.this, format);
            Log.e(TAG, format);
        }
    }
}
